package cn.tedu.net.collection.api;

import java.util.Objects;

public class Test1_Object {
    public static void main(String[] args) {
        //测试toString方法 返回的就是对象的字符串表示
        Student student=new Student(99,"迪迦");
//在打印student对象时底层会自动调用Object的toString方法
// 这个默认实现方法打印的是getClass().getName() + "@" + Integer.toHexString(hashCode())
        //查看源码的方式:按住Ctrl键,鼠标移动到目标位置上即可
        System.out.println(student);//cn.tedu.api.Student@1b6d3586打印的地址值
        //重写了toString之后打印的就是对象的属性值了
        //测试hashCode():返回对象在内存中的哈希码值
        System.out.println(student.hashCode());//460141958
        //创建对象student1和student属性值相同
        //测试equals()
        Student student1 =new Student(99,"迪迦");
        //底层用的==进行比较,比较的是student1与student保存的地址值
        System.out.println(student.equals(student1));//false
    }
}
//1.创建一个类Student类并定义属性
class Student extends Object{
    int age;
    String name;
//生成构造方法
    public Student() {
    }

    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "学生的年龄:" + age + ",学生的姓名:" + name;
    }
//重写equals()
//需求:比较student和student1对象,如果属性值完全一样,就认为是同一个对象
    @Override
    public boolean equals(Object o) {
        //匹配类型--判断是否是学生类型,如果连学生都不是,直接返回false
        if(o instanceof/*比较类型*/ Student){
            //把o向下转型,因为想用子类的特有属性
            Student student=(Student) o;
            if(this.name==student.name&&this.age==student.age){
                return true;
            }
        }
        return false;
       /* if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);*/
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}
